package com.fdh.myjdbcutil;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 解析ResultSet实现类
 *
 * @author fdh
 * @version 1.0
 */
public class AnalysisResultSetImpl implements IAnalysisResultSet {
    private final ResultSet resultSet;

    public AnalysisResultSetImpl(ResultSet resultSet) {
        this.resultSet = resultSet;
    }

    @Override
    public ResultSet getResultSet() {
        return resultSet;
    }

    /**
     * 解析ResultSet,把ResultSet转为行列表
     *
     * @param colNames 需要解析的列名
     * @return 每行数据, 行数据和输入的列名相对应, 转换失败返回null
     */
    @Override
    public ArrayList<Object[]> analyseResultSet(String[] colNames) {
        return MyJdbcUtil.getInstance().analysisResultSet(resultSet, colNames);
    }

    /**
     * 解析ResultSet,自动注入实体类,注意只会注入一行数据,
     * 即使有多行也只注入最上面的那行数据
     *
     * @param colNames 需要解析的列名
     * @param target   实体类
     * @param <T>      实体类类型
     * @return 注入好的实体类, 如果没有数据或转换失败返回null
     */
    @Override
    public <T extends IMyEntity> T analyseResultSet(String[] colNames, T target) {
        return MyJdbcUtil.getInstance().analysisResultSet(resultSet, colNames, target);
    }

    /**
     * 解析ResultSet,自动注入实体类,注意只会注入一行数据
     * ,即使有多行也只注入最上面的那行数据
     *
     * @param colNames    需要解析的列名
     * @param targetClass 实体类class
     * @param <T>         实体类类型
     * @return 注入好的实体类
     */
    @Override
    public <T extends IMyEntity> T analyseResultSet(String[] colNames, Class<T> targetClass) {
        return MyJdbcUtil.getInstance().analysisResultSet(resultSet, colNames, targetClass);
    }

    /**
     * 解析ResultSet并自动注入到实体类中,返回结果列表
     *
     * @param colNames    列名数组
     * @param targetClass 目标class
     * @param <T>         实体类类型
     * @return 结果列表
     */
    @Override
    public <T extends IMyEntity> List<T> analyseResultSetReturnList(String[] colNames, Class<T> targetClass) {
        return MyJdbcUtil.getInstance().analysisResultSetReturnList(resultSet, colNames, targetClass);
    }

    /**
     * 解析ResultSet,自动注入实体类,注意只会注入一行数据,
     * 即使有多行也只注入最上面的那行数据
     *
     * <p>支持封装类</p>
     *
     * @param colNames 需要解析的列名
     * @param target   实体类
     * @param <T>      实体类类型
     * @return 注入好的实体类, 如果没有数据或转换失败返回null
     */
    @Override
    public <T extends IMyEntity> T analyseResultSet_upgrade(String[] colNames, T target) {
        return MyJdbcUtil.getInstance().analysisResultSet_upgrade(resultSet, colNames, target);
    }

    /**
     * 解析ResultSet,自动注入实体类,注意只会注入一行数据,
     * 即使有多行也只注入最上面的那行数据
     *
     * <p>支持封装类</p>
     *
     * @param colNames    列名
     * @param targetClass 实体类class
     * @param <T>         实体类型
     * @return 注入好的实体类, 如果没有数据或转换失败返回null
     */
    @Override
    public <T extends IMyEntity> T analyseResultSet_upgrade(String[] colNames, Class<T> targetClass) {
        return MyJdbcUtil.getInstance().analysisResultSet_upgrade(resultSet, colNames, targetClass);
    }

    /**
     * 解析ResultSet,自动注入实体类,返回结果列表
     *
     * <p>支持封装类</p>
     *
     * @param colNames    列名
     * @param targetClass 实体类class
     * @param <T>         实体类型
     * @return 实体类列表, 如果出错返回null
     */
    @Override
    public <T extends IMyEntity> List<T> analyseResultSetReturnList_upgrade(String[] colNames, Class<T> targetClass) {
        return MyJdbcUtil.getInstance().analysisResultSetReturnList_upgrade(resultSet, colNames, targetClass);
    }
}
